const path = require('path');
const { app, BrowserWindow, nativeTheme, Tray, nativeImage, Menu, contextBridge, ipcMain } = require('electron');
const { initDownload } = require('./download')
const NODE_ENV = process.env.NODE_ENV
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';

let mainWindow = null
let defaultTemplate = [
    {
        label: '编辑',
        submenu: [
            { role: 'cut', label: '剪切' },
            { role: 'copy', label: '复制' },
            { role: 'paste', label: '粘贴' },
            { role: 'selectAll', label: '全选' }
        ]
    },
    {
        label: '窗口',
        submenu: [
            { role: 'reload', label: '刷新' },
            { role: 'forceReload', label: '强制刷新' },
            { role: 'toggleDevTools', label: '控制台' },
            { type: 'separator' },
            { role: 'resetZoom', label: '重置' },
            { role: 'zoomIn', label: '放大' },
            { role: 'zoomOut', label: '缩小' },
            { type: 'separator' },
            { role: 'togglefullscreen', label: '全屏' }
        ]
    },
    {
        role: 'help',
        label: '帮助',
        submenu: [
            {
                label: '关于应用',
                click: async () => {
                    const { shell } = require('electron')
                    await shell.openExternal('http://www.baidu.com')
                }
            }
        ]
    }
]

function createWindow() {
    // 创建浏览器窗口
    mainWindow = new BrowserWindow({
        width: NODE_ENV === 'development' ? 1500 : 900,
        height: 700,
        resizable: false,
        icon: path.join(__dirname, '../dist/natalie.ico'),
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            nodeIntegration: true,
            contextIsolation: false
        },
    });

    const cmd_args = process.argv.slice(1); // 获取除应用路径外的所有命令行参数
    // console.log("args ============== ",args);

    ipcMain.on('request-cmd-args', (event, arg) => {
        console.log("主进程收到的参数: ", arg);
        let ws_url = ""
        for (let item of cmd_args) {
            if (item.startsWith("--ws-url=")) {
                ws_url = item.split("=")[1]
                break;
            }
        }
        let api_url = ""
        for (let item of cmd_args) {
            if (item.startsWith("--api-url=")) {
                api_url = item.split("=")[1]
                break;
            }
        }
        let udp_port = ""
        for (let item of cmd_args) {
            if (item.startsWith("--udp-port=")) {
                udp_port = item.split("=")[1]
                break;
            }
        }
        const responseData = {
            ws_url: ws_url,
            api_url: api_url,
            udp_port: udp_port,
        };
        event.sender.send('response-cmd-args', responseData);
    });

    nativeTheme.themeSource = 'dark'
    mainWindow.on('closed', (res) => {
        console.log('=== app closed ===')
        app.quit()
    })
    mainWindow.loadURL(
        NODE_ENV === 'development'
            ? 'http://localhost:3000'
            : `file://${path.join(__dirname, '../dist/index.html')}`
    );
    initDownload(mainWindow)

    if (NODE_ENV === 'development') {
        mainWindow.webContents.openDevTools();
    }

    //  监听右键菜单触发
    mainWindow.webContents.on('context-menu', (event, params) => {
        const selectEnabled = !!params.selectionText.trim().length
        const template = []
        if (params.isEditable) {
            template.unshift(...[{
                label: '粘贴',
                role: 'paste'
            }])
        }
        if (selectEnabled) {  //选中文字时
            template.unshift(...[{
                label: '复制',
                role: 'copy',
                visible: () => !selectEnabled
            },
            {
                label: '剪切',
                role: 'cut'
            }])
        }
        if (template.length) {
            const RightMenu = Menu.buildFromTemplate(template)
            RightMenu.popup()
        }
    })
}

let menu; // 菜单
if (NODE_ENV === 'development') {
    menu = Menu.buildFromTemplate(defaultTemplate)
} else {
    menu = Menu.buildFromTemplate([])
}

Menu.setApplicationMenu(menu)

let tray
// 这段程序将会在 Electron 结束初始化和创建浏览器窗口的时候调用部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
    const icon = nativeImage.createFromPath(path.join(__dirname, '../dist/appicon.png'))
    tray = new Tray(icon)
    createWindow()
    app.on('activate', function () {
        // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他打开的窗口，那么程序会重新创建一个窗口。
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
});
// 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});
